#include "dictionnaire.h"

cellule * initCell(int tailleChar){
    char * a = calloc(tailleChar,sizeof(char));
    cellule * cell = calloc(1,sizeof(cellule));
    cell->sequence = a;
    cell->taille = 0;
}

int cellequ(cellule * seq1,cellule * seq2) {
    int i =0;
    if( seq1->taille == seq2->taille && seq1->taille>0)
    {
        for(i=0;i<seq1->taille;i++) {
                if (seq1->sequence[i]!=seq2->sequence[i]) return 0;
     }
     return 1;
    }
    else { return 0; }
}

cellule * cellcpy(cellule * dest,cellule * src){
    
    int i;
    if (src->taille>=0) {
        for(i=0;i<src->taille;i++) {
            dest->sequence[i] = src->sequence[i];
        }
        dest->taille = src ->taille;
    } 
    return dest;
}

cellule * cellcat(cellule * dest,cellule * src){
    int i,j;
    for(i = dest->taille,j=0;i<dest->taille+src->taille;i++,j++){
        dest->sequence[i] = src->sequence[j];
    }
    dest->taille = dest->taille + src->taille;
    return dest;
}


int Initialiser(){
    
    int i = 0;
    char *tmp ;   
    
    Dictionnaire = calloc(TAILLE_DICO,sizeof(cellule));
    
    for ( i  ; i<258; i++){
        tmp = calloc(1,sizeof(char));
        tmp[0] = (char) i;
        //Dictionnaire[i].sequence = malloc(sizeof(char));
        Dictionnaire[i].sequence = tmp;
        Dictionnaire[i].taille = 1;   
    }
    last_elem = i;
    
    return NO_ERROR;
}

int Inserer (Code prefixe, Code mono){
    
    if(last_elem>=TAILLE_DICO) 
        return DICO_ERROR;
    else {    
//        char*tmp1;
//        tmp1 =malloc(sizeof(char)*(Dictionnaire[prefixe].taille)+sizeof(char));
        cellule * tmp1;
        cellule * tmp2;
        tmp1 = initCell((Dictionnaire[prefixe].taille)+1);
         
        //strcpy(tmp1,Dictionnaire[prefixe].sequence);
        cellcpy(tmp1,&Dictionnaire[prefixe]);
       
        Dictionnaire[last_elem].sequence = malloc(sizeof(char)*((Dictionnaire[prefixe].taille)+sizeof(char)));
        //Dictionnaire[last_elem].sequence = malloc(sizeof(char)*100);
         
        tmp2 = cellcat(tmp1,&Dictionnaire[mono]); //strcat(tmp1, Dictionnaire[mono].sequence);
        Dictionnaire[last_elem] =  *tmp2;
        Dictionnaire[last_elem].taille = (Dictionnaire[prefixe].taille)+1;
        //printf("Code: %d | Val:%s |Taille:%d\n",last_elem,Dictionnaire[last_elem].sequence,Dictionnaire[last_elem].taille);
        last_elem++;
    
        return NO_ERROR;
    }
}



void AfficherDictionnaire(){
    int i ;
    for ( i = 0; i < last_elem; i++){
        //printf("Code: %d | Val:%s |Taille:%d\n",i,Dictionnaire[i].sequence,Dictionnaire[i].taille);
        printf("Code: %d | ",i); AfficherCellule(Dictionnaire[i]);
    }
}
void AfficherCellule(cellule  cell) {
    printf("Val:%s |Taille:%d\n",cell.sequence,cell.taille);
}

cellule *CodeVersChaine(Code code, int longueur){
        
    if ( code <= last_elem ) {
      
        return &Dictionnaire[code];
    }
    
    return NULL; 
    
}


Code SequenceVersCode( char *sequence, int longueur){
    int i ;
    cellule * cell = initCell(100);
    cell->sequence = sequence;
    cell->taille = longueur;
    
    for ( i = 0 ; i<last_elem; i++){      
        if ( cellequ(&Dictionnaire[i],cell)) { //if ( strcmp(Dictionnaire[i].sequence,sequence)) {    

            return i;
        }
    }    
    return -1;
    
}

void libererDico(){
    int i ;
    for ( i = 0; i < last_elem; i++){
        free(Dictionnaire[i].sequence);
    }
    free(Dictionnaire);
}